package com.sjc.algorithm.job;

/**
 * 用户画像
 * ID username  job  sex age city
 * 位图操作：
 * 并: &
 * 或：|
 * 异或: ^ 在全量数据中不是90后的用户
 * @author by SangJiacun
 * @Date 2020/5/14 13:57
 */
public class BitMap {

    // 每一个word是一个long类型元素，对应64位二进制
    private long[] words;
    // bitmap的位数大小
    private int size;

    public BitMap(int size){
        this.size = size;
        words = new long[getWordIndex(size-1)+1];
    }

    public boolean getBit(int bitIndex) throws Exception {
        if(bitIndex <0 || bitIndex > size-1){
            throw new Exception(" 超过了 BitMap 有效范围!");
        }
        int wordIndex = getWordIndex(bitIndex);
        return (words[wordIndex] & (1L << bitIndex)) != 0;
    }


    public void setBit(int bitIndex) throws Exception {
        if(bitIndex <0 || bitIndex > size-1){
            throw new Exception(" 超过了 BitMap 有效范围!");
        }

        int wordIndex = getWordIndex(bitIndex);
        words[wordIndex] = words[wordIndex] | (1L << bitIndex);
    }

    /**
     * 定位bitmap某一位所对应的word
     * @param bitIndex 位图的第bitIndex位
     * @return
     */
    private int getWordIndex(int bitIndex){
        // 右移6位，相当于除以64
        return bitIndex >> 6;
    }

    public static void main(String[] args) throws Exception {
//        BitMap bitMap = new BitMap(128);
//        bitMap.setBit(126);
//        bitMap.setBit(102);
//        bitMap.setBit(89);
//        bitMap.setBit(75);
//        System.out.println(Long.toBinaryString(bitMap.words[1]));
//        System.out.println(bitMap.getBit(126));
//        System.out.println(bitMap.getBit(78));
        System.out.println(3 << 2);
    }
}
